python使用hash列表

您所在的位置:网站首页 python 散列 python使用hash列表

python使用hash列表

2023-01-18 18:15| 来源: 网络整理| 查看: 265

首先什么时hash(哈希):参考来自:哈希表(散列表)原理详解_那年聪聪的博客-CSDN博客_哈希表

哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

记录的存储位置=f(关键字)

这里的对应关系f称为散列函数,又称为哈希(Hash函数),采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表(Hash table)。

想要高效遍历查找,可以借助哈希列表,将需要计算地对象转换成哈希列表,对于没接触过的小伙伴来说,一听吓一跳;但是我们可以借助python底层的某些数据结构,因为像python中的字典,和集合查找方法,其底层是通过哈希查找来实现的。我们拿过来直接用就好了,不用自己再绕弯子创建哈希列表了。至于如何创建哈希列表不在本帖子的讨论范围内,感兴趣的可以参考:python实现哈希表_Who is abc的博客-CSDN博客_哈希表python实现

下面是一个简单的借用hash查找的简单案例,分别未采用基本的遍历,采用字典和采用集合方法进行计算,并对效率进行简单的对比:

对比思路:计算两个数组list_a = range(0, 20000); list_b = range(5000, 25000);的元素相同的个数,其中,每个数组中的元素都是独一的,并打印三种方法的计算时间,以此对比普通方法和哈希查找的效率情况:

import time ''' 当需要对两个容器中的元素进行查找计算时,并且两个容器中的元素都是独一的; 如:两个列表中的元素进行计算; 可以巧用字典或集合来大幅度提升效率; ''' def timer(func): def func_wrapper(*args, **kwargs): from time import time; time_start = time(); result = func(*args, **kwargs); time_end = time(); time_spend = time_end - time_start; print('%s cost time: %.3f s' % (func.__name__, time_spend)); return result; return func_wrapper; @timer def normal_compute(list_a, list_b): #传统的for循环嵌套进行遍历查找 print("normal_compute:"); same_count = 0; for a in list_a: for b in list_b: if a == b: same_count += 1; pass pass print("same_count=", same_count); @timer def dict_compute(list_a, list_b): print("dict_compute:"); same_count = 0; #将列表转换成字典的键,通过遍历键来达到查找的目的 dic_a = dict(zip(list_a, list_a));#value无所谓赋值成什么 dic_b = dict(zip(list_b, list_b)); for key in dic_a.keys(): if key in dic_b.keys(): same_count += 1; pass pass print("same_count=", same_count); @timer def set_compute(list_a, list_b): print("set_compute:"); same_count = 0; #将列表转换成集合,借用底层hash set_a = set(list_a); set_b = set(list_b); for ele in set_a: if ele in set_b: same_count += 1; pass pass print("same_count=", same_count); list_a = range(0, 20000); list_b = range(5000, 25000); normal_compute(list_a, list_b); dict_compute(list_a, list_b); set_compute(list_a, list_b);

三种方法的计算时间,如下图所示:

计算结果

可以看到,在相同的计算量条件下,普通的嵌套for循环,耗时11.2s左右,借用字典或者集合的哈希查找方法,耗时均为0.01s左右,甚至集合的计算时间都不到0.01s(有可能是set占用的资源比dict少的缘故)。

哈希查找的效率名不虚传啊!

以上是我的分享,如有错误,请严厉指正!谢谢!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3